package com.ruoyi.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.pojo.result.Pages;
import com.ruoyi.common.core.pojo.vo.TokenVO;
import com.ruoyi.system.api.model.user.AppUser;
import com.ruoyi.user.model.pojo.entity.User;
import com.ruoyi.user.model.pojo.request.app.*;
import com.ruoyi.user.model.pojo.request.crm.CrmSearchUserRequest;
import com.ruoyi.user.model.pojo.result.UserSearchInfo;
import com.ruoyi.user.model.pojo.result.app.UserBasicsInfo;
import com.ruoyi.user.model.pojo.result.app.UserSearchInfoResult;
import com.ruoyi.user.model.pojo.result.crm.CrmUserInfoResult;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 房间表 服务类
 * </p>
 *
 * @author ${author}
 * @since 2024-11-17
 */
public interface IUserService extends IService<User> {


    User loginVerify(String phone);

    /**
     * APP端登录
     */
    TokenVO<String> login(LoginRequest request) throws Exception;


    /**
     * 获取用户详细信息
     *
     * @param userId    我的id 查询是否关注使用 可以为0
     * @param aimUserId 查询用户id
     */
    UserBasicsInfo find(Long userId, Long aimUserId);


    /**
     * 用户表信息转换为基础信息对象
     */
    UserBasicsInfo userMapBuild(User user, Long userId, Long adminUserId);

    /**
     * 实名认证
     *
     * @param userId
     * @param request
     * @return
     */
    String realAuth(Long userId, AppUserAuthRequest request);


    boolean realAuthResult(String certifyId, Long userId);

    /**
     * 设置监护密码
     *
     * @param userId
     * @param request
     */
    void setTeenager(Long userId, AppUserSetTeenagerRequest request);

    /**
     * 查询用户信息
     *
     * @param userId
     * @return
     */
    User findUserInfo(Long userId);

    /**
     * 内部获取用户信息
     *
     * @param userId
     * @return
     */
    AppUser getUserById(Long userId);

    List<UserSearchInfo> getUserList(List<User> records, Long userId);

    /**
     * 校验验证码
     *
     * @param phone
     * @param secretKey
     */
    void verifyCode(String phone, String secretKey);

    /**
     * 获取指定用户id关注的ids
     *
     * @param userId
     * @return
     */
    Set<Long> attention(Long userId);

    Pages<UserSearchInfo> searchUser(AppSearchUserRequest request, Long userId);


    /**
     * 关注的状态
     *
     * @param userId
     * @param aimUserId
     * @return
     */
    Integer isAttention(Long userId, Long aimUserId);

    /**
     * 后台用户列表
     */
    Pages<CrmUserInfoResult> listPage(CrmSearchUserRequest request);

    /**
     * 更新用户
     */
    boolean updateUser(Long userId, AppUpdateUserRequest request);

    /**
     * 解除/封禁
     */
    boolean forbiddenAndrelieve(Long userId, Integer status);


    /**
     * 获取新人用户
     */
    Set<Long> getNewUser();


    /**
     * 内部调用获取同城数据
     */
    Set<Long> getCityWide(Long userId);


}
